home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 37 / IOPROG_37.ISO / SOFT / Multilizer.exe / disk1 / data1.cab / data1 / [Group9]VCL Source Standard / ivreader.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1999-08-12  |  5.1 KB  |  261 lines

  1. unit IvReader;
  2.  
  3. {$I IVMULTI.INC}
  4.  
  5. interface
  6.  
  7. uses
  8. {$IFDEF WIN32}
  9.   Windows,
  10. {$ELSE}
  11.   WinTypes, WinProcs,
  12. {$ENDIF}
  13.   SysUtils;
  14.  
  15. const
  16.   LF_C: Char = Char($0A);
  17.   CR_C: Char = Char($0D);
  18.  
  19.   MULTILIZER_RES_TYPE_C = 'MULTILIZER';
  20.  
  21. type
  22.   TIvBaseReader = class(TObject)
  23.   protected
  24.     FStorageName: String;
  25.  
  26.   public
  27.     procedure Open; virtual; abstract;
  28.  
  29.     function Eof: Boolean; virtual; abstract;
  30. {$IFDEF WIN32}
  31.     function ReadLine: String; virtual; abstract;
  32. {$ELSE}
  33.     function ReadLine: PChar; virtual; abstract;
  34. {$ENDIF}
  35.  
  36.     property StorageName: String read FStorageName write FStorageName;
  37.   end;
  38.  
  39.   TIvAnsiReader = class(TIvBaseReader)
  40.   protected
  41.     FHandle: Integer;
  42.     FBufferSize: Integer;
  43.     FBufferIndex: Integer;
  44.     FBuffer: array[0..255] of Char;
  45.  
  46.     function ReadIntoBuffer: Integer;
  47.  
  48.   public
  49.     constructor Create;
  50.     destructor Destroy; override;
  51.  
  52.     procedure Open; override;
  53.     procedure Close;
  54.  
  55.     function Eof: Boolean; override;
  56. {$IFDEF WIN32}
  57.     function ReadLine: String; override;
  58. {$ELSE}
  59.     function ReadLine: PChar; override;
  60. {$ENDIF}
  61.   end;
  62.  
  63. {$IFDEF WIN32}
  64.   TIvResourceAnsiReader = class(TIvBaseReader)
  65.   protected
  66.     FBuffer: PChar;
  67.     FBufferIndex: Integer;
  68.     FBufferSize: Integer;
  69.  
  70.   public
  71.     constructor Create;
  72.  
  73.     procedure Open; override;
  74.     function Eof: Boolean; override;
  75.     function ReadLine: String; override;
  76.   end;
  77. {$ENDIF}
  78.  
  79. implementation
  80.  
  81. constructor TIvAnsiReader.Create;
  82. begin
  83.   inherited Create;
  84.   FHandle := 0;
  85. end;
  86.  
  87. destructor TIvAnsiReader.Destroy;
  88. begin
  89.   Close;
  90.   inherited Destroy;
  91. end;
  92.  
  93. function TIvAnsiReader.ReadIntoBuffer: Integer;
  94. begin
  95.   FBufferIndex := 0;
  96.   FBufferSize := FileRead(FHandle, FBuffer, SizeOf(FBuffer)) div SizeOf(Char);
  97.   Result := FBufferSize;
  98. end;
  99.  
  100. procedure TIvAnsiReader.Open;
  101. begin
  102.   FHandle := FileOpen(FStorageName, fmOpenRead or fmShareDenyNone);
  103.   if FHandle <= 0 then
  104.     raise EInOutError.Create('Could not open the file ' + FStorageName);
  105.  
  106.   FBufferIndex := 0;
  107.   FBufferSize := 0;
  108. end;
  109.  
  110. procedure TIvAnsiReader.Close;
  111. begin
  112.   if FHandle > 0 then
  113.   begin
  114.     FileClose(FHandle);
  115.     FHandle := 0;
  116.     FBufferIndex := 0;
  117.     FBufferSize := 0;
  118.   end;
  119. end;
  120.  
  121. function TIvAnsiReader.Eof: Boolean;
  122. begin
  123.   if (FBufferSize = 0) or (FBufferIndex = FBufferSize) then
  124.     ReadIntoBuffer;
  125.   Result := FBufferSize = 0;
  126. end;
  127.  
  128. {$IFDEF WIN32}
  129. function TIvAnsiReader.ReadLine: String;
  130. var
  131.   c: Char;
  132. begin
  133.   Result := '';
  134.   while True do
  135.   begin
  136.     if (FBufferIndex = FBufferSize) and (ReadIntoBuffer = 0) then
  137.       Break;
  138.  
  139.     c := FBuffer[FBufferIndex];
  140.     Inc(FBufferIndex);
  141.  
  142.     if c = LF_C then
  143.       // Unix style text file (only LF at the end of line)
  144.  
  145.       Break
  146.     else if c = CR_C then
  147.     begin
  148.       if (FBufferIndex = FBufferSize) and (ReadIntoBuffer = 0) then
  149.         Break;
  150.  
  151.       Inc(FBufferIndex);
  152.       Break;
  153.     end
  154.     else
  155.       Result := Result + c;
  156.   end;
  157. end;
  158. {$ELSE}
  159. function TIvAnsiReader.ReadLine: PChar;
  160. var
  161.   c: Char;
  162.   newStr: PChar;
  163.   len, size, newSize: Integer;
  164. begin
  165.   len := 0;
  166.   size := 256;
  167.   Result := StrAlloc(size);
  168.   while True do
  169.   begin
  170.     if (FBufferIndex = FBufferSize) and (ReadIntoBuffer = 0) then
  171.       Break;
  172.  
  173.     c := FBuffer[FBufferIndex];
  174.     Inc(FBufferIndex);
  175.  
  176.     if c = CR_C then
  177.     begin
  178.       if (FBufferIndex = FBufferSize) and (ReadIntoBuffer = 0) then
  179.         Break;
  180.  
  181.       Inc(FBufferIndex);
  182.       Break;
  183.     end
  184.     else
  185.     begin
  186.       if len >= size then
  187.       begin
  188.         newSize := 3*size div 2;
  189.         newStr := StrAlloc(newSize);
  190.         StrLCopy(newStr, Result, size);
  191.         StrDispose(Result);
  192.         Result := newStr;
  193.         size := newSize;
  194.       end;
  195.       Result[len] := c;
  196.       Inc(len);
  197.     end;
  198.   end;
  199.   Result[len] := Char(0);
  200. end;
  201. {$ENDIF}
  202.  
  203. {$IFDEF WIN32}
  204. constructor TIvResourceAnsiReader.Create;
  205. begin
  206.   inherited Create;
  207.   FBuffer := nil;
  208.   FBufferIndex := 0;
  209.   FBufferSize := 0;
  210. end;
  211.  
  212. procedure TIvResourceAnsiReader.Open;
  213. var
  214.   resource: HRSRC;
  215.   handle: HGLOBAL;
  216. begin
  217.   resource := FindResource(HInstance, PChar(FStorageName), MULTILIZER_RES_TYPE_C);
  218.   if resource = 0 then
  219.     raise EInOutError.Create('Could not open the resource ' + FStorageName);
  220.  
  221.   handle := LoadResource(HInstance, resource);
  222.   if handle = 0 then
  223.     raise EInOutError.Create('Could not open the resource ' + FStorageName);
  224.  
  225.   FBuffer := LockResource(handle);
  226.   FBufferIndex := 0;
  227.   FBufferSize := SizeofResource(HInstance, resource);
  228. end;
  229.  
  230. function TIvResourceAnsiReader.Eof: Boolean;
  231. begin
  232.   Result := FBufferIndex = FBufferSize;
  233. end;
  234.  
  235. function TIvResourceAnsiReader.ReadLine: String;
  236. var
  237.   c: Char;
  238. begin
  239.   Result := '';
  240.   while True do
  241.   begin
  242.     c := FBuffer[FBufferIndex];
  243.     Inc(FBufferIndex);
  244.  
  245.     if c = LF_C then
  246.       // Unix style text file (only LF at the end of line)
  247.  
  248.       Break
  249.     else if c = CR_C then
  250.     begin
  251.       Inc(FBufferIndex);
  252.       Break;
  253.     end
  254.     else
  255.       Result := Result + c;
  256.   end;
  257. end;
  258. {$ENDIF}
  259.  
  260. end.
  261.